dpdata推出Format插件机制,实现与数据格式的无缝集成
随着DP用户使用的计算软件愈加广泛,我们迫切需要将新的数据格式与dpdata无缝集成。近日,dpdata推出Format架构,此架构可提供一种通过dpdata注册新格式的插件机制,且无需更改dpdata代码。
无缝集成的需求
在此之前,任何新格式的集成都需要对dpdata进行修改。这种方式有下列缺点:
复杂的依赖项。不同格式可能需要额外的Python依赖项,增加dpdata的技术复杂性。
开发速度较慢。更改需要DeepModeling团队审核代码,这一过程比较耗时间,拖慢各种格式的开发速度,影响用户的使用。
需要测试大量格式。每个新格式都会增加测试的数量。
容易损坏。各种格式与主程序高度耦合,缺少明确定义的API,因此更容易遭到损坏。
何为Format插件?
Format插件机制无需针对特定格式对dpdata代码进行更改。该机制可以通过dpdata提供的Format API添加新格式。插件开发者可以为插件维护单独的代码仓库和分发软件包,并负责测试相应的格式。在这种情况下,dpdata主程序的依赖项和测试过程不会受到插件的影响。
Format插件机制有以下组件:
自定义Format类:插件通过继承dpdata.format.Format类将自己的数据格式注册到dpdata中,该子类应当具有相应的from_system、to_system、from_labeled_system、to_labeled_system等方法。
Format键:Format类通过Format.register装饰器注册数据格式的键,一个Format类可以注册多个键,但应当不与其它格式的键重复。
创建和使用Format插件
这里,我们试图创建一个名为random的新格式,它可以随机生成一串Frame,用于我们的范例。
from dpdata.format import Format
import numpy as np
@Format.register("random")
class RandomFormat(Format):
def from_system(self, N, **kwargs):
return {
"atom_numbs": [20],
"atom_names": ['X'],
"atom_types": [0] * 20,
"cells": np.repeat(np.diag(np.diag(np.ones((3, 3))))[np.newaxis,...], N, axis=0) * 100.,
"coords": np.random.rand(N, 20, 3) * 100.,
}
这里,我们创建了RandomFormat类,这个类具有一个from_system方法,返回了包含数据的字典。我们为RandomFormat注册了random的键。之后,我们便可以使用random格式:
print(dpdata.System(12, fmt="random"))
Data SummaryUnlabeled System
-------------------
Frame Numbers : 12
Atom Numbers : 20
Element List :
-------------------
X
20
此外,我们还可以用setuptools将这个插件打包,发布到pypi上。
from setuptools import setup
setup(
name="dpdata_random",
packages=['dpdata_random'],
version='0.0.1',
entry_points={
'dpdata.plugins': [
'random=dpdata_random:RandomFormat'
]
},
install_requires=['dpdata', 'numpy'],
)
这里需要注意的是,我们需要将RandomFormat类注册到dpdata.plugins的entry point中。
Deep Modeling社区
诚邀投稿
如果你用Deep Modeling社区软件做了有趣的工作,想让更多人看见;
如果你发现Deep Modeling社区的软件神奇的应用,想与更多人分享;
如果你有对领域前沿的真知灼见,欲与大家分享,欢迎来稿!
我们的邮箱:
contact@deepmodeing.org